package com.thunisoft.proxy;

import java.io.FileOutputStream;

import com.thunisoft.proxy.cglib.CglibProxyTest;
import com.thunisoft.proxy.impl.CglibTest;
import com.thunisoft.proxy.impl.Test;
import com.thunisoft.proxy.impl.TestImpl;
import com.thunisoft.proxy.jvm.DynamicProxyTest;

import net.sf.cglib.core.DebuggingClassWriter;
import sun.misc.ProxyGenerator;

/**
 * @title App.java
 * @package com.thunisoft.proxy
 * @projectName spring.boot
 * @author yzj 
 * @date 2019年6月12日 下午5:56:24
 */
public class App {

	/**
	 * @param args
	 * {@https://www.cnblogs.com/haiq/p/4304615.html}
	 */
	public static void main(String[] args) {

		//测试jdk动态代理
		//JDK动态代理只能对实现了接口的类生成代理，而不能针对类
		Test test=new TestImpl();
		//生成新类结构为 public class $Proxy0 extends Proxy implements 传入的接口{ } 
		//生成java类的测试
		Test dynamicProxy = DynamicProxyTest.newProxyInstance(test);
		dynamicProxy.test(12);
		System.out.println(dynamicProxy==test);
        
        byte[] classFile = ProxyGenerator.generateProxyClass("$Proxy0", TestImpl.class.getInterfaces());
        String path = "F:\\workspace\\spring.boot\\target\\classes\\com\\thunisoft\\proxy\\jvm\\TestProxy.class";
        try {
        	FileOutputStream fos = new FileOutputStream(path);
            fos.write(classFile);
            fos.flush();
            System.out.println("代理类class文件写入成功");
        } catch (Exception e) {
           System.out.println("写文件错误");
        }
        System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "F:\\workspace\\spring.boot\\target\\cglib");
        //CGLIB是针对类实现代理，主要是对指定的类生成一个子类，覆盖其中的方法
        CglibTest cglibProxy = CglibProxyTest.newProxyInstance(CglibTest.class);
        cglibProxy.test(15);
        System.err.println(cglibProxy.getClass());
        
        

	}

}
